package com.haohan.jingyuan.gateway.dto;

import lombok.Data;

/**
 * 统一API响应格式
 */
@Data
public class GwResponse<T> {

    /** 响应码，例如：200 表示成功，500 表示服务器错误 */
    private int code;
    /** 响应消息，描述本次请求的结果信息 */
    private String message;
    private String path;
    /** 响应数据负载，泛型类型用于承载任意业务数据 */
    private T data;
    /** 响应时间戳（毫秒），用于标识响应生成时间 */
    private long timestamp;

    /**
     * 无参构造，初始化时间戳。
     */
    public GwResponse() {
        this.timestamp = System.currentTimeMillis();
    }

    /**
     * 仅包含响应码与消息的构造方法。
     * @param code 响应码
     * @param message 响应消息
     */
    public GwResponse(int code, String message) {
        this();
        this.code = code;
        this.message = message;
    }

    /**
     * 包含响应码、消息与数据的构造方法。
     * @param code 响应码
     * @param message 响应消息
     * @param data 响应数据
     */
    public GwResponse(int code, String message, T data) {
        this(code, message);
        this.data = data;
    }

    /**
     * 构造无数据的成功响应，默认消息为“操作成功”。
     * @param <T> 数据类型
     * @return GwResponse 对象
     */
    public static <T> GwResponse<T> success() {
        return new GwResponse<>(200, "操作成功");
    }

    /**
     * 构造带数据的成功响应，默认消息为“操作成功”。
     * @param data 响应数据
     * @param <T> 数据类型
     * @return GwResponse 对象
     */
    public static <T> GwResponse<T> success(T data) {
        return new GwResponse<>(200, "操作成功", data);
    }

    /**
     * 构造带自定义消息与数据的成功响应。
     * @param message 成功消息
     * @param data 响应数据
     * @param <T> 数据类型
     * @return GwResponse 对象
     */
    public static <T> GwResponse<T> success(String message, T data) {
        return new GwResponse<>(200, message, data);
    }

    /**
     * 构造带自定义消息的成功响应（无数据）。
     * @param message 成功消息
     * @return GwResponse 对象
     */
    public static GwResponse<Void> success(String message) {
        return new GwResponse<>(200, message);
    }

    /**
     * 构造通用错误响应，默认错误码为 500。
     * @param message 错误消息
     * @param <T> 数据类型
     * @return GwResponse 对象
     */
    public static <T> GwResponse<T> error(String message) {
        return new GwResponse<>(500, message);
    }

    /**
     * 构造带自定义错误码与消息的错误响应。
     * @param code 错误码
     * @param message 错误消息
     * @param <T> 数据类型
     * @return GwResponse 对象
     */
    public static <T> GwResponse<T> error(int code, String message) {
        return new GwResponse<>(code, message);
    }
}